package com.migration.model.migration;

import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 迁移脚本抽象基类
 * 所有新增的迁移脚本应该继承此类，并在构造函数中设置相关配置
 */
@Data
@EqualsAndHashCode(callSuper = true)
public abstract class AbstractMigrationScript extends MigrationScript {
    
    /**
     * 构造函数
     * 
     * @param name 迁移名称
     * @param description 迁移描述
     * @param sourceTable 源表名
     * @param targetTable 目标表名
     * @param order 执行顺序
     */
    protected AbstractMigrationScript(String name, String description, String sourceTable, String targetTable, Integer order) {
        this.setName(name);
        this.setDescription(description);
        this.setSourceTable(sourceTable);
        this.setTargetTable(targetTable);
        this.setOrder(order);
        
        // 设置SQL语句
        this.setTruncateSql(generateTruncateSql());
        this.setMigrationSql(generateMigrationSql());
    }
    
    /**
     * 生成清空表的SQL
     * 子类可以覆盖此方法提供自定义的清空SQL
     * 
     * @return 清空表的SQL
     */
    protected String generateTruncateSql() {
        return "TRUNCATE TABLE " + getTargetTable() + ";";
    }
    
    /**
     * 生成迁移数据的SQL
     * 子类需要实现此方法提供具体的迁移SQL
     * 
     * @return 迁移数据的SQL
     */
    protected abstract String generateMigrationSql();
} 